﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using FairyZeta.FF14.ACT.Logger.Setting;
using FairyZeta.FF14.ACT.Logger.LogType.LogResult.LogLevel;

namespace FairyZeta.FF14.ACT.Logger.LogType.LogResult
{
    /// <summary> ログ情報のレベルを表します。
    /// <para> --------- 異常情報 ----------------------------------------------------------------------------------------------------- </para>
    /// <para> FATAL: 異常を表します。異常を予期していない状態で、プログラムは続行不可能。</para>
    /// <para> ERROR: 異常を表します。異常を予期していない状態で、プログラムは続行可能。</para>
    /// <para> WARNING: 警告を表します。異常を予期している状態で、リカバリー可能である。（ファイルが無いため作成した、など）</para>
    /// <para> --------- 正常情報 ----------------------------------------------------------------------------------------------------- </para>
    /// <para> NOTICE: 情報を表します。INFOの上位レベルで、用途は同じですが、こちらは「ユーザーに通知するべき情報」です。（保存に成功した、など）</para>
    /// <para> INFO: 情報を表します。基本レベルの情報で、開始や終了の記録、内部状態など、注目すべき事象を記録します。</para>
    /// <para> MEMO: 情報を表します。INFOの下位レベルで、処理速度やファイル容量を考えた場合に「記録しないこと」を視野に入れる情報です。</para>
    /// <para> --------- 開発情報 ----------------------------------------------------------------------------------------------------- </para>
    /// <para> DEBUG: 情報を表します。動作確認のために必要な情報であり、基本的に「ユーザーが気にする必要のない情報」です。</para>
    /// <para> TRACE: 情報を表します。DEBUGと用途は同じですが、DEBUGよりも更に詳細な情報や、細かいステップ数で記録します。</para>
    /// </summary>
    public abstract class _LogResultBase
    {
      /*--- プロパティ/フィールド定義 ---------------------------------------------------------------------------------------------------------------------------------*/

        /// <summary> 異常レベル：ログ情報のレベルを表します。
        /// <para> --------- 異常情報 ----------------------------------------------------------------------------------------------------- </para>
        /// <para> FATAL: 異常を表します。異常を予期していない状態で、プログラムは続行不可能。</para>
        /// <para> ERROR: 異常を表します。異常を予期していない状態で、プログラムは続行可能。</para>
        /// <para> WARNING: 警告を表します。異常を予期している状態で、リカバリー可能である。（ファイルが無いため作成した、など）</para>
        /// </summary>
        public FATAL FATAL { get; set; }
        /// <summary> 異常レベル：ログ情報のレベルを表します。
        /// <para> --------- 異常情報 ----------------------------------------------------------------------------------------------------- </para>
        /// <para> FATAL: 異常を表します。異常を予期していない状態で、プログラムは続行不可能。</para>
        /// <para> ERROR: 異常を表します。異常を予期していない状態で、プログラムは続行可能。</para>
        /// <para> WARNING: 警告を表します。異常を予期している状態で、リカバリー可能である。（ファイルが無いため作成した、など）</para>
        /// </summary>
        public ERROR ERROR { get; set; }
        /// <summary> 異常レベル：ログ情報のレベルを表します。
        /// <para> --------- 異常情報 ----------------------------------------------------------------------------------------------------- </para>
        /// <para> FATAL: 異常を表します。異常を予期していない状態で、プログラムは続行不可能。</para>
        /// <para> ERROR: 異常を表します。異常を予期していない状態で、プログラムは続行可能。</para>
        /// <para> WARNING: 警告を表します。異常を予期している状態で、リカバリー可能である。（ファイルが無いため作成した、など）</para>
        /// </summary>
        public WARNING WARNING { get; set; }
        /// <summary> 正常レベル：ログ情報のレベルを表します。
        /// <para> --------- 正常情報 ----------------------------------------------------------------------------------------------------- </para>
        /// <para> NOTICE: 情報を表します。INFOの上位レベルで、用途は同じですが、こちらは「ユーザーに通知するべき情報」です。（保存に成功した、など）</para>
        /// <para> INFO: 情報を表します。基本レベルの情報で、開始や終了の記録、内部状態など、注目すべき事象を記録します。</para>
        /// <para> MEMO: 情報を表します。INFOの下位レベルで、処理速度やファイル容量を考えた場合に「記録しないこと」を視野に入れる情報です。</para>
        /// </summary>
        public NOTICE NOTICE { get; set; }
        /// <summary> 正常レベル：ログ情報のレベルを表します。
        /// <para> --------- 正常情報 ----------------------------------------------------------------------------------------------------- </para>
        /// <para> NOTICE: 情報を表します。INFOの上位レベルで、用途は同じですが、こちらは「ユーザーに通知するべき情報」です。（保存に成功した、など）</para>
        /// <para> INFO: 情報を表します。基本レベルの情報で、開始や終了の記録、内部状態など、注目すべき事象を記録します。</para>
        /// <para> MEMO: 情報を表します。INFOの下位レベルで、処理速度やファイル容量を考えた場合に「記録しないこと」を視野に入れる情報です。</para>
        /// </summary>
        public INFO INFO { get; set; }
        /// <summary> 正常レベル：ログ情報のレベルを表します。
        /// <para> --------- 正常情報 ----------------------------------------------------------------------------------------------------- </para>
        /// <para> NOTICE: 情報を表します。INFOの上位レベルで、用途は同じですが、こちらは「ユーザーに通知するべき情報」です。（保存に成功した、など）</para>
        /// <para> INFO: 情報を表します。基本レベルの情報で、開始や終了の記録、内部状態など、注目すべき事象を記録します。</para>
        /// <para> MEMO: 情報を表します。INFOの下位レベルで、処理速度やファイル容量を考えた場合に「記録しないこと」を視野に入れる情報です。</para>
        /// </summary>
        public MEMO MEMO { get; set; }
        /// <summary> 開発レベル：ログ情報のレベルを表します。
        /// <para> --------- 開発情報 ----------------------------------------------------------------------------------------------------- </para>
        /// <para> DEBUG: 情報を表します。動作確認のために必要な情報であり、基本的に「ユーザーが気にする必要のない情報」です。</para>
        /// <para> TRACE: 情報を表します。DEBUGと用途は同じですが、DEBUGよりも更に詳細な情報や、細かいステップ数で記録します。</para>
        /// </summary>
        public DEBUG DEBUG { get; set; }
        /// <summary> ログ情報のレベルを表します。
        /// <para> --------- 開発情報 ----------------------------------------------------------------------------------------------------- </para>
        /// <para> DEBUG: 情報を表します。動作確認のために必要な情報であり、基本的に「ユーザーが気にする必要のない情報」です。</para>
        /// <para> TRACE: 情報を表します。DEBUGと用途は同じですが、DEBUGよりも更に詳細な情報や、細かいステップ数で記録します。</para>
        /// </summary>
        public TRACE TRACE { get; set; }

      /*--- コンストラクタ --------------------------------------------------------------------------------------------------------------------------------------------*/

        /// <summary> コンストラクタ
        /// </summary>
        /// <param name="in_LD"> LogDefinition:ロガー定義 </param>
        /// <param name="in_LS"> LoggerSetting:ロガーの設定モデル </param>
        /// <param name="in_LogResult"> LogResult:ログの状態を設定 </param>
        public _LogResultBase(LogStatusDefinition in_LD, LoggerSetting in_LS, LogResultEnum in_LogResult)
        {
            LogStatusDefinition ld = new LogStatusDefinition()
            {
                LogLevelEnum = in_LD.LogLevelEnum,
                LogResultEnum = in_LogResult,
                LogTypeEnum = in_LD.LogTypeEnum
            };

            this.InitData(ld, in_LS);
        }

      /*--- メソッド：Public ------------------------------------------------------------------------------------------------------------------------------------------*/
        
        /// <summary> プロパティ/フィールドを初期化します。
        /// </summary>
        public void InitData(LogStatusDefinition in_LD, LoggerSetting in_LS)
        {
            this.FATAL = new FATAL(in_LD, in_LS);
            this.ERROR = new ERROR(in_LD, in_LS);
            this.WARNING = new WARNING(in_LD, in_LS);
            this.NOTICE = new NOTICE(in_LD, in_LS);
            this.INFO = new INFO(in_LD, in_LS);
            this.MEMO = new MEMO(in_LD, in_LS);
            this.DEBUG = new DEBUG(in_LD, in_LS);
            this.TRACE = new TRACE(in_LD, in_LS);
        }
      /*--- メソッド：Private -----------------------------------------------------------------------------------------------------------------------------------------*/


    }
}
